package peace.htmllooker
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.text.StyleSheet;

import peace.gui.layout.Container;
	
/**
 * Узел с дочерними элементами
 * 
 */	
public class Box extends Node
{
	/**
	 * Флаг, выставляемый в true, если размер контейнера изменился. 
	 * С ним вызов arrange() пройдет удачно. 
	 */		
	public var needArrange:Boolean = true;
	/**
	 * 
	 */	
	protected var container:Container = new Container();
	/**
	 * 
	 * @param xml
	 * @param css
	 * 
	 */
	public function Box(xml:XML, css:StyleSheet)
	{
		super(xml, css);
	}
	/**
	 * 
	 * @param xml
	 * @param css
	 * 
	 */	
	override protected function init(xml:XML, css:StyleSheet):void
	{
		createChildren(xml, css);
		
		addChild(background);
		addChild(container);
		
		addEventListener(Event.ENTER_FRAME, onEnterFrame, false,0,true);
		
		needArrange = true;
	}
	/**
	 * virtual <br>
	 * 
	 * Рожаем детей и добавляем в контейнер
	 * 
	 * @param xml
	 * @param css
	 * 
	 */	
	protected function createChildren (xml:XML, css:StyleSheet):void
	{
	}
	/**
	 * 
	 * @return 
	 * 
	 */	
	override public function get content():DisplayObject
	{
		return container;
	}
	/**
	 * Реакция на изменение размеров дочернего узла. <br>
	 * 
	 * Всю цепочку родителей до Htmllooker помечаем для выравнивания.
	 * 
	 * @param child
	 * 
	 */	
	public final function childSizeChanged (child:Node):void
	{
		needArrange = true;
		
		if (parentBox) parentBox.childSizeChanged(this); 
	}
	/**
	 * Оптимизация работы с графикой:
	 * 
	 * Дисплей-объекты слышат ENTER_FRAME событие сверху вниз по иерархии
	 * т.о. самый верхний объект в иерархии услышит первым и обновит положение всего дерева,
	 * выставив флаги needArrange в false
	 *  
	 * @param e
	 * 
	 */	
	private function onEnterFrame (e:Event):void
	{
		if (needArrange)
		{
			arrange();
		}
	}
	/**
	 * 
	 * @return 
	 * 
	 */	
	override public function get width():Number
	{
		return container.width + shellWidth;
	}
	/**
	 * 
	 * @param value
	 * 
	 */
	override public function set width(value:Number):void
	{
		if (value != container.userWidth + shellWidth)
		{
			needArrange = true;
			// риальные требуемые движком резмеры сохраняем 
			// как пользовательские размеры контейнера
			container.userWidth = value - shellWidth;
		}
	}
	/**
	 * 
	 * @return 
	 * 
	 */
	override public function get height():Number
	{
		return container.height + shellHeight;
	}
	/**
	 * 
	 * @param value
	 * 
	 */
	override public function set height(value:Number):void
	{
		if (value != container.userHeight + shellHeight)
		{
			needArrange = true;
			// риальные требуемые движком резмеры сохраняем 
			// как пользовательские размеры контейнера
			container.userHeight = value - shellHeight;
		}
	}
	
	
	
	
}
}